package com.lqk.jdk.composite;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lqk
 * @date 2021/12/6 17:00
 */
public class Composite {
    public static void main(String[] args) {
        /**
         * 说明：
         *  1. Map 就是一个抽象的构建（类似我们的 Component）
         *  2. HashMap 是一个中间构建（Composite），实现了相关的方法 put、putAll。。
         *  3. Node 是HashMap的静态内部类，类似 Leaf 叶子结点，这里就没有 put、putAll 等方法
         *  static class Node<K,V> implements Map.Entry<K,V>
         *
         *  组合模式的注意事项和细节
         *      1) 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子
         *      的问题。
         *      2) 具有较强的扩展性。当我们要更改组合对象时，我们只需要调整内部的层次关系，
         *      客户端不用做出任何改动.
         *      3) 方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节，容易添加节点
         *      或者叶子从而创建出复杂的树形结构
         *      4) 需要遍历组织机构，或者处理的对象具有树形结构时, 非常适合使用组合模式.
         *      5) 要求较高的抽象性，如果节点和叶子有很多差异性的话，比如很多方法和属性
         *      都不一样，不适合使用组合模式
         */
        // TODO Auto-generated method stub
        Map<Integer,String> hashMap=new HashMap<Integer,String>();
        hashMap.put(0, "东游记");//直接存放叶子节点(Node)

        Map<Integer,String> map=new HashMap<Integer,String>();  // Composite:非叶子节点， 用于存储子部件
        map.put(1, "西游记");
        map.put(2, "红楼梦"); //..
        hashMap.putAll(map);
        System.out.println(hashMap);
    }
}
